An ecologically-flavoured introduction to statistics - Day 1
Goal
acquire an intuition about statistical methods: their nature, usage scenarios, and limitations
literature
- Galileo Galilei - Il saggiatore
- Sally Calrdwell - Statisctics unplugged
- David Fredman, Robert Pisani, Roger Purves - Statistics
- Darrell Huff - How to lie with statistics
- Shannons theory of information (degree of surprise / contrast)
Definitions
Statistic
A numerical value which characterises the sample or population from which it was derived \(\rightarrow\) statistics is the study of the collection, analysis, interpretation, presentation, and organisation of data ### Population (sample set) A complete set fo items that share at least one property in common that is the subject of a statistical analysis. ### Sample (event set) A limited number of observations systematically or (pseudo)randomly selected from a population, whose analysis may yield generalisations about the source population. \(\rightarrow\) must be representative ### Statistical estimator The estimators estimate a population parameter based on sample data
- \(\overline{x}\) estimates \(\mu\)
- \(\mu\) is the population mean
- \(\overline{x}\) is the sample mean
- a sample size of 3 is too small to calculate the mean
Plan an experiment
Design your experiment with the data analysis in mind!
- minimum number if replicates needed \(\rightarrow\) perform a power analysis
- disentangle the influence of confounding variables
- determine the statistical analyses that will be used
- one replicates a treatment/effect on an experimental unit
- the effect needs to be independet on one experimental unit
- replicates need to be independet on one another
data types
- binary (logical)
- quantitative (discontinuous)
- quantitative (continuous)
- ordinal / ranked
- categorical / nominal (can be transformed with dummy numeric variables)
Location of data
Pythagorean means
- the arithmetic mean: \(\overline{x}=\frac{1}{n}\sum_{i=1}^{n} x_{i}\) \(\rightarrow\) often refered to as expected value E(X), where X is a random variable
- the geometric mean: \(\sqrt[n]{\prod_{i=1}^{n} x_{i}}\)
- the harmonic mean: \(\overline{x}=n\sum_{i=1}^{n} \frac{1}{x_{i}}\) \(\rightarrow\) inequality concerning AM, GM, and HM: \(AM \ge GM \ge HM\)
Statistical location
- the median: order your data and take the middle value
- the mode: most commen value of a data series \(\rightarrow\) multiple modes possible: unimodal<bimodal<multimodal \(\rightarrow\) different distributions call for different measures of center! The arithmetic mean is not always valid!
- skewness: measure of symmetry \(\rightarrow\) negative (left) skewness: the mean of the data values is less than the median \(\rightarrow\) positive (right) skewness: the mean of the data values is larger than the median
Spread of data
- range: highest - lowest value
- sample variance: \(s^2 = \frac{1}{n-1} \sum_{i=1}^{n} (x_{i}-\overline{x})^2\) \(\rightarrow\) \(s^2 \ge 0\) \(\rightarrow\) \(s^2 = 0\) all values are equal
- standard deviation: \(s = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_{i}-\overline{x})^2}\) \(\rightarrow\) standardised form of the variance
- coefficient of variation: \(\frac{s}{\overline{x}}\) \(\rightarrow\) used when comparing multiple samples with different means. Standardisation!
- concept of central moments: variance, skewness, and kurtosis are all related through this concept
An ecologically-flavoured introduction to statistics - Day 2
The Random Variable
- \(X \sim f(p_{1} \dots p_{n})\)
- \((x_{i} \dots x_{n}) \in X\)
- a variable whose value varies according to chance
- each value has an assigned probability
Normal distribution
- \(X \sim N(\mu, \sigma)\)
- only controlled by two variables
- probability density funciton: \(P(X) = \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}\)
- Even if each sample-derived ramdom variable in a large collection of random variables (from the same population) is non-Gaussian, their means are distributed normally! \(\rightarrow\) central limit theorem
Various Distributions
The Student’s t distribution
The result of trying to estimate the mean of a normally distributed population when n is small and \(\sigma\) is unknown
- n = ~ 30
- \(X \sim f(p_{1} \dots p_{n})\)
- \(X \sim T(\nu)\)
- \(\nu > 0\): the degrees of freedom
Degrees of freedom
The number of independent units of information used in the estimation of a parameter or calculation of a statistic ~ the numer of values that are ‘free to vary’ in this process. n values have n degrees of freedom until something (e.g. a mean) is estimated - this consumes a degree of freedom \(\rightarrow\) this does not apply to non-parametric tests (e.g. spearman correlation coefficient) because the tests use ranks.
The Discrete Random Variable
A variable whose value, which is always an integer, varies according to ‘chance’. Each possible value has a probability assigned to it.
- probability mass function for a discrete variable
- assigns a probability to a discrete outcome
- \(\overline{x} \rightarrow \mu_{x} = \sum_{i=1}^N p_{i} x_{i}\)
- \(s^2 \rightarrow \sigma_{x}^2 = \sum_{i=1}^N p_{i}(x_{i}-\mu_{x})^2\)

The Binomial Distribution
The discrete probability distribution of the number of successes in n, independent yes/no experiments. Each trial is associated with a probability of success p, and a probability of failure q (complement), where \(q = 1 -p\) (One of the popular discrete variables)
- \(X \sim B(n,p)\)
- \(n \in N\): number of trials \(\rightarrow\) not the number of samples from a B(n,p) distribution, but trials within the distribution
- \(p \in [0,1]\): failure, success
- the number of successes k, after n independet trials is given by: \(P(X=k)=\binom{n}{k}p^k(1-p)^{n-k}\) \(\rightarrow\)
- Bernoulli distribution: yes / no results
The Poisson Distribution
Associated with rare events \(\rightarrow\) probability of k events happening in a given time period or in a given spatial range where \(\lambda\) is the expected number of events (known or estimated) \(\rightarrow\) \(\approx B(n,p)\) with large n and small p
- \(X \sim Pois(\lambda)\)
- \(\lambda > 0\): equivalent to E(X) and Var(X)
- for \(k \in \{1,2,\dots,n\}\), the probability mass funtion of X is: \(P(X=k)=\frac{\lambda^ke^{-\lambda}}{k!}\)
\(\rightarrow\) discrete probability mass function
Character
Covariance \(\rightarrow\) how do the variances of two variables relate?
Correlation \(\rightarrow\) Pearson’s coefficient: only linear correlation - Cov(X,Y)/sx*sy - cares about values \(\rightarrow\) Spearman’s rank coefficient: - gives the data ranks - useful for ordinal data
Linear Regression - y = mx + b - x is the explainatory factor (independent variable) - y is the response (dependent variable) - m is the slope - b is the intercept
An ecologically-flavoured introduction to statistics - Day 3
\(H_{0}\): The null hypothesis
Example with background distribution (N, \(\sigma\)) - \(H_{0}:E(activity)=\mu\) and \(H_{A}:E(activity)<\mu\) - \(H_{0}:E(activity)=\mu\) and \(H_{A}:E(activity)>\mu\) - \(H_{0}:E(activity)=\mu\) and \(H_{A}:E(activity)\neq\mu\)
Hypothesis testing
\(\rightarrow\) the goal of a good experiment is to minimise both Type I and Type II errors
General procedure
- clearly state \(H_{0}, H_{A}, \alpha\) and n
- generate the null distribution
- collect data and calculate the test statistic
- locate where the statistic is in the null distribution
- draw conclusion
What is a statistically ‘significant’ result?
If we assume a certain sampling distribution holds for a given statistic, then we can predict how it ‘should’ behave and react when there’s a strong deviation from that expectation.
The logic of the P value
A P value reflects the probability that \(H_{0}\) is true. If it is small (e.g. < 0.05) we can reject \(H_{0}\). It is the probability that one would obtain a test statistic at least as exrtreme as the one observed by chance alone, given \(H_{0}\) is true.
- P values have nothing to do with the effect size
- a large P value doesn’t mean that the effect size is not there
- most of the time it’s more a question of experimental or sampling design (i.e. low n)
- the interpretation of P values is more involved than noted here! Most researchers use them incorrectly, giving them for too much weight
- low P values do not mean that you will automatically be able to replicate your result or generalise your interpretation
- be careful with overreplication
- Regina Nuzzo - Statistical Errors
Confidence interval
- Often prefered by journals instead of p values
- I can make statements based on my datas variations and the stability of the number of replicates I have, about how likely it is / in which range I would expect the true population parameter (the mean standard deviation) to fall into
- It’s more than giving a location of a sample mean I am providing an interval where the sample statistic can catch
- If the population parameter is not in the confidence interval calculated from the observed data, then the data is considered as odd
- confidence level
- Understanding Confidence Intervals: Statistics Help
- \(\overline{x} \pm (z {\frac{\sigma}{\sqrt{n}}})\)
- \(\rightarrow\) sample mean plusminus the z score times the standard error (variance divided by square root of number of samples)
- sample mean from normally distributed data will itself be normally distributed (with \(\mu\) and standard error (\(\frac{\sigma}{\sqrt{n}})\))
Z scores have a cumulative normal distribution (kind of the factor of sigma for a desired confidence)
- confidence intervals refer to the reliability of an estimation based on some data, not the probability of the parameter actually falling into the interval (the population parameter doesn’t change!)
- confidence intervals do not predict where most of your data fall
like P values, there is no guarantee that the confidence interval will hold in an independent experiment
statistical tests

- most test rely on independet populations (difference between sample means)
- some other test rely on related populations
t-test
- independent, random samples
- normally distributions
- populations variances are unknown but are assumed to be equal
- students t distribution (for small n)
- Z-test for normal distributions (for large n)
- t-test can be used for large n but behaves like the Z test \(\rightarrow\) that is why people only talk about the t-test
The one-sample t-test
- compare some E(X) to some known value with a known distribution
- usually this value is a mean belonging to a normal distribution
- \(H_{0}\): no significant differance between \(\mu\) and x
- \(H_{A}\): significant difference beween \(\mu\) and x
- test statistic is t-statistic
- \(t_{obs}=\frac{\overline{X}-\mu}{\frac{s}{\sqrt{n}}}\)
- \(t_{obs}>t_{n-1,\alpha}\) then we reject \(H_{0}\)
- \(t_{obs}\leq t_{n-1,\alpha}\) then we accept \(H_{0}\) (or not requect it)
- \(t_{n-1,\alpha} \rightarrow\) is the critical value
The two-sample t-test
- insterested in the location
- similar to one-sided t-test
- covariance instead of variance
- instead of substracting the mean from a given mean we substract the mean of the distribution from the mean of another distribution
- \(t_{obs}=\frac{\overline{X}-\overline{Y}}{\sqrt{\frac{s_{x}^{2}}{n_{x}^{2}}+\frac{s_{y}^{2}}{n_{y}^{2}}}}\)
- \(t_{obs}>t_{n-2,\alpha}\) then we reject \(H_{0}\)
- \(t_{obs}\leq t_{n-2,\alpha}\) then we accept \(H_{0}\) (or not requect it)
- \(t_{n-2,\alpha} \rightarrow\) is the critical value
Z-test
- kind of the
- squares missing
- \(z=\frac{\overline{x}-\mu}{\frac{\sigma_{x}}{\sqrt{n}}}\)
- \(z_{obs}>z_{\alpha}\) then we reject \(H_{0}\)
- \(z_{obs}\leq z_{\alpha}\) then we accept \(H_{0}\) (or not requect it)
- \(z_{\alpha} \rightarrow\) is the critical value
F-test
- usually used to test how good a model fits the data
- follows after regression
- tests the equality of two variances (modeled data vs. real data)
- controlled by the degrees of freedom (df) of two distributions

- in case of \(df_{1}=1\) & \(df_{2}=1\) replication is extremely low \(\rightarrow\) extreme poisson distribution
- in case of \(df_{1}=100\) & \(df_{2}=100\) replication is high \(\rightarrow\) normal distribution
- more dfs means more confident in the estimation
the mean of the distributions is connected as it is part of the variances
F-statistic comes out of the F-test – sum of squares of the explained variation (modeled) & sum of squares of the unexplained variation
ANOVA
- used to test whether groups are different from each other
- ANOVA and t-test are closely liked together \(\rightarrow\) two-sa mple ANOVA is equivalent to t-test
- it doesn’t matter if group 1 and group 2 are overlapping when group 3 is completly off \(\rightarrow\) ANOVA will give you a significant result, that at least 1 group is different from the others
- \(H_{0}:\mu_{1}=\mu_{2}=\mu_{3}=...=\mu_{n} \rightarrow\) not treatment effect
\(H_{A}\) at least one group has different mean
process – partition variation into modelled variation and error (residuals) – generates an f-statistic: modelled/error variance – large F-values indicate that the model explains most of the variance
assumptions – response variables are normally distributed (check with Barlett’s or Levene’s test, but also look at it!!!) – variances of responce variables are equal (check for heteroscedasticity, corrections available) – samples are independent – \[F_{N,K}=\frac{\sum_{i}{n_{i}(\overline{Y_{i}}-\overline{\overline{Y}})^2/K-1}}{\sum_{i,j}{(Y_{i,j}-\overline{Y_{i}})^2/N-K}}\] – focus on \[F=\frac{SS_{between}}{SS_{within}}\] – SSbetween –> fit – SSwithin –> error – N = overall sample size – K = number of groups – j = observations – i = groups – \(\overline{Y}\) = group mean – \(\overline{\overline{Y}}\) = grand mean

Fisher’s exact test
for categorical data
- exact, because the p-value is calculated exactly \(\rightarrow\) no distribution is used
- n is usually small, but also usable for large n (but there are more powerful tests) – p doesn’t have to be estimated
- non-parametric

Non-parametric tests
- for non-normal data, and when transformation doesn’t help
- don’t assume a distribution
- more robust
you loose power, because data are e.g. ranked, less sensitivity
most parametric test have a non-parametric equivalent 
significance is test by creating our own distribution \(\rightarrow\) resampling
Resampling
used to test significance of non-parametric tests
Jackknifing
- calculate statistic from original data
- remove rows of the data randomly (as often as you can, limited by original data)
- recalculate test statistic
- the distribution of statistics is messed up \(\rightarrow\) when original statistic falls into the new distribution there are no differences \(\rightarrow\) when original statistic falls out of the new distribution there is a difference
Bootstrapping
- calculate statistic from original data
- bootstrap the rows/columns (remove some / add some from original data )
Permutation
- it matters how we permute – e.g. when we permute within a species column, the distribution over sites doesn’t matter – e.g. when complete species columns are moved, the species distribution is still intact
- various permutation possibilities – within rows – of rows – within columns – of columns
LS0tCnRpdGxlOiAiYmFzaWMgc3RhdGlzdGljcyBsZWN0dXJlIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIEFuIGVjb2xvZ2ljYWxseS1mbGF2b3VyZWQgaW50cm9kdWN0aW9uIHRvIHN0YXRpc3RpY3MgLSBEYXkgMQoKIyMgR29hbAphY3F1aXJlIGFuIGludHVpdGlvbiBhYm91dCBzdGF0aXN0aWNhbCBtZXRob2RzOiB0aGVpciBuYXR1cmUsIHVzYWdlIHNjZW5hcmlvcywgYW5kIGxpbWl0YXRpb25zCgojIyBsaXRlcmF0dXJlCi0gR2FsaWxlbyBHYWxpbGVpIC0gSWwgc2FnZ2lhdG9yZQotIFNhbGx5IENhbHJkd2VsbCAtIFN0YXRpc2N0aWNzIHVucGx1Z2dlZAotIERhdmlkIEZyZWRtYW4sIFJvYmVydCBQaXNhbmksIFJvZ2VyIFB1cnZlcyAtIFN0YXRpc3RpY3MKLSBEYXJyZWxsIEh1ZmYgLSBIb3cgdG8gbGllIHdpdGggc3RhdGlzdGljcwotIFNoYW5ub25zIHRoZW9yeSBvZiBpbmZvcm1hdGlvbiAoZGVncmVlIG9mIHN1cnByaXNlIC8gY29udHJhc3QpCgojIyBMaW5rcwoKLSBbbWF0aGVtYXRpYyBzeW1ib2xzIDFdKGh0dHBzOi8vd3d3LmNhbHZpbi5lZHUvfnJwcnVpbS9jb3Vyc2VzL3MzNDEvUzE3L2Zyb20tY2xhc3MvTWF0aGluUm1kLmh0bWwpCi0gW21hdGhlbWF0aWMgc3ltYm9scyAyXShodHRwczovL29laXMub3JnL3dpa2kvTGlzdF9vZl9MYVRlWF9tYXRoZW1hdGljYWxfc3ltYm9scykKLSBbcm1hcmtkb3duIGNoZWF0c2hlZXRdKGh0dHBzOi8vcnN0dWRpby5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTUvMDIvcm1hcmtkb3duLWNoZWF0c2hlZXQucGRmKQoKIyMgRGVmaW5pdGlvbnMKIyMjIFN0YXRpc3RpYwpBIG51bWVyaWNhbCB2YWx1ZSB3aGljaCBjaGFyYWN0ZXJpc2VzIHRoZSAqc2FtcGxlKiBvciAqcG9wdWxhdGlvbiogZnJvbSB3aGljaCBpdCB3YXMgZGVyaXZlZAokXHJpZ2h0YXJyb3ckIHN0YXRpc3RpY3MgaXMgdGhlIHN0dWR5IG9mIHRoZSBjb2xsZWN0aW9uLCBhbmFseXNpcywgaW50ZXJwcmV0YXRpb24sIHByZXNlbnRhdGlvbiwgYW5kIG9yZ2FuaXNhdGlvbiBvZiBkYXRhCiMjIyBQb3B1bGF0aW9uIChzYW1wbGUgc2V0KQpBIGNvbXBsZXRlIHNldCBmbyBpdGVtcyB0aGF0IHNoYXJlIGF0IGxlYXN0IG9uZSBwcm9wZXJ0eSBpbiBjb21tb24gdGhhdCBpcyB0aGUgc3ViamVjdCBvZiBhIHN0YXRpc3RpY2FsIGFuYWx5c2lzLgojIyMgU2FtcGxlIChldmVudCBzZXQpCkEgKmxpbWl0ZWQgbnVtYmVyKiBvZiBvYnNlcnZhdGlvbnMgc3lzdGVtYXRpY2FsbHkgb3IgKHBzZXVkbylyYW5kb21seSBzZWxlY3RlZCBmcm9tIGEgcG9wdWxhdGlvbiwgd2hvc2UgYW5hbHlzaXMgbWF5IHlpZWxkIGdlbmVyYWxpc2F0aW9ucyBhYm91dCB0aGUgc291cmNlIHBvcHVsYXRpb24uICRccmlnaHRhcnJvdyQgbXVzdCBiZSByZXByZXNlbnRhdGl2ZQojIyMgU3RhdGlzdGljYWwgZXN0aW1hdG9yClRoZSBlc3RpbWF0b3JzIGVzdGltYXRlIGEgcG9wdWxhdGlvbiBwYXJhbWV0ZXIgYmFzZWQgb24gc2FtcGxlIGRhdGEKCi0gJFxvdmVybGluZXt4fSQgZXN0aW1hdGVzICRcbXUkCi0gJFxtdSQgaXMgdGhlIHBvcHVsYXRpb24gKm1lYW4qCi0gJFxvdmVybGluZXt4fSQgaXMgdGhlIHNhbXBsZSAqbWVhbioKLSBhIHNhbXBsZSBzaXplIG9mIDMgaXMgdG9vIHNtYWxsIHRvIGNhbGN1bGF0ZSB0aGUgbWVhbgoKIyMgUGxhbiBhbiBleHBlcmltZW50CkRlc2lnbiB5b3VyIGV4cGVyaW1lbnQgd2l0aCB0aGUgZGF0YSBhbmFseXNpcyBpbiBtaW5kIQoKLSBtaW5pbXVtIG51bWJlciBpZiByZXBsaWNhdGVzIG5lZWRlZCAkXHJpZ2h0YXJyb3ckIHBlcmZvcm0gYSBwb3dlciBhbmFseXNpcwotIGRpc2VudGFuZ2xlIHRoZSBpbmZsdWVuY2Ugb2YgY29uZm91bmRpbmcgdmFyaWFibGVzCi0gZGV0ZXJtaW5lIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNlcyB0aGF0IHdpbGwgYmUgdXNlZAotIG9uZSByZXBsaWNhdGVzIGEgdHJlYXRtZW50L2VmZmVjdCBvbiBhbiBleHBlcmltZW50YWwgdW5pdAotIHRoZSBlZmZlY3QgbmVlZHMgdG8gYmUgaW5kZXBlbmRldCBvbiBvbmUgZXhwZXJpbWVudGFsIHVuaXQKLSByZXBsaWNhdGVzIG5lZWQgdG8gYmUgaW5kZXBlbmRldCBvbiBvbmUgYW5vdGhlcgoKIyMgZGF0YSB0eXBlcwoKLSBiaW5hcnkgKGxvZ2ljYWwpCi0gcXVhbnRpdGF0aXZlIChkaXNjb250aW51b3VzKQotIHF1YW50aXRhdGl2ZSAoY29udGludW91cykKLSBvcmRpbmFsIC8gcmFua2VkCi0gY2F0ZWdvcmljYWwgLyBub21pbmFsIChjYW4gYmUgdHJhbnNmb3JtZWQgd2l0aCBkdW1teSBudW1lcmljIHZhcmlhYmxlcykKCiMjIExvY2F0aW9uIG9mIGRhdGEKIyMjIFB5dGhhZ29yZWFuIG1lYW5zCi0gKnRoZSBhcml0aG1ldGljIG1lYW4qOiAkXG92ZXJsaW5le3h9PVxmcmFjezF9e259XHN1bV97aT0xfV57bn0geF97aX0kCiRccmlnaHRhcnJvdyQgb2Z0ZW4gcmVmZXJlZCB0byBhcyBleHBlY3RlZCB2YWx1ZSBFKFgpLCB3aGVyZSBYIGlzIGEgcmFuZG9tIHZhcmlhYmxlCi0gKnRoZSBnZW9tZXRyaWMgbWVhbio6ICRcc3FydFtuXXtccHJvZF97aT0xfV57bn0geF97aX19JAotICp0aGUgaGFybW9uaWMgbWVhbio6ICRcb3ZlcmxpbmV7eH09blxzdW1fe2k9MX1ee259IFxmcmFjezF9e3hfe2l9fSQKJFxyaWdodGFycm93JCBpbmVxdWFsaXR5IGNvbmNlcm5pbmcgQU0sIEdNLCBhbmQgSE06ICRBTSBcZ2UgR00gXGdlIEhNJAoKIyMjIFN0YXRpc3RpY2FsIGxvY2F0aW9uCi0gKnRoZSBtZWRpYW4qOiBvcmRlciB5b3VyIGRhdGEgYW5kIHRha2UgdGhlIG1pZGRsZSB2YWx1ZQotICp0aGUgbW9kZSo6IG1vc3QgY29tbWVuIHZhbHVlIG9mIGEgZGF0YSBzZXJpZXMKJFxyaWdodGFycm93JCBtdWx0aXBsZSBtb2RlcyBwb3NzaWJsZTogdW5pbW9kYWw8Ymltb2RhbDxtdWx0aW1vZGFsCiRccmlnaHRhcnJvdyQgZGlmZmVyZW50IGRpc3RyaWJ1dGlvbnMgY2FsbCBmb3IgZGlmZmVyZW50IG1lYXN1cmVzIG9mIGNlbnRlciEgVGhlIGFyaXRobWV0aWMgbWVhbiBpcyBub3QgYWx3YXlzIHZhbGlkIQotICpza2V3bmVzcyo6IG1lYXN1cmUgb2Ygc3ltbWV0cnkKJFxyaWdodGFycm93JCBuZWdhdGl2ZSAobGVmdCkgc2tld25lc3M6IHRoZSBtZWFuIG9mIHRoZSBkYXRhIHZhbHVlcyBpcyBsZXNzIHRoYW4gdGhlIG1lZGlhbgokXHJpZ2h0YXJyb3ckIHBvc2l0aXZlIChyaWdodCkgc2tld25lc3M6IHRoZSBtZWFuIG9mIHRoZSBkYXRhIHZhbHVlcyBpcyBsYXJnZXIgdGhhbiB0aGUgbWVkaWFuCgojIyBTcHJlYWQgb2YgZGF0YQoKLSAqcmFuZ2UqOiBoaWdoZXN0IC0gbG93ZXN0IHZhbHVlCi0gKnNhbXBsZSB2YXJpYW5jZSo6ICRzXjIgPSBcZnJhY3sxfXtuLTF9IFxzdW1fe2k9MX1ee259ICh4X3tpfS1cb3ZlcmxpbmV7eH0pXjIkIAokXHJpZ2h0YXJyb3ckICRzXjIgXGdlIDAkCiRccmlnaHRhcnJvdyQgJHNeMiA9IDAkIGFsbCB2YWx1ZXMgYXJlIGVxdWFsCi0gKnN0YW5kYXJkIGRldmlhdGlvbio6ICRzID0gXHNxcnR7XGZyYWN7MX17bi0xfSBcc3VtX3tpPTF9XntufSAoeF97aX0tXG92ZXJsaW5le3h9KV4yfSQKJFxyaWdodGFycm93JCBzdGFuZGFyZGlzZWQgZm9ybSBvZiB0aGUgdmFyaWFuY2UKLSAqY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uKjogJFxmcmFje3N9e1xvdmVybGluZXt4fX0kCiRccmlnaHRhcnJvdyQgdXNlZCB3aGVuIGNvbXBhcmluZyBtdWx0aXBsZSBzYW1wbGVzIHdpdGggZGlmZmVyZW50IG1lYW5zLiBTdGFuZGFyZGlzYXRpb24hCi0gKmNvbmNlcHQgb2YgY2VudHJhbCBtb21lbnRzKjogdmFyaWFuY2UsIHNrZXduZXNzLCBhbmQga3VydG9zaXMgYXJlIGFsbCByZWxhdGVkIHRocm91Z2ggdGhpcyBjb25jZXB0CgojIEFuIGVjb2xvZ2ljYWxseS1mbGF2b3VyZWQgaW50cm9kdWN0aW9uIHRvIHN0YXRpc3RpY3MgLSBEYXkgMgoKIyMgVGhlIFJhbmRvbSBWYXJpYWJsZQoKLSAkWCBcc2ltIGYocF97MX0gXGRvdHMgcF97bn0pJAotICQoeF97aX0gXGRvdHMgeF97bn0pIFxpbiBYJAotIGEgdmFyaWFibGUgd2hvc2UgdmFsdWUgdmFyaWVzIGFjY29yZGluZyB0byBjaGFuY2UKLSBlYWNoIHZhbHVlIGhhcyBhbiBhc3NpZ25lZCBwcm9iYWJpbGl0eQoKIyMgTm9ybWFsIGRpc3RyaWJ1dGlvbgoKLSAkWCBcc2ltIE4oXG11LCBcc2lnbWEpJAotIG9ubHkgY29udHJvbGxlZCBieSB0d28gdmFyaWFibGVzCi0gKnByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY2l0b24qOiAkUChYKSA9IFxmcmFjezF9e1xzaWdtYSBcc3FydHsyXHBpfX0gZV57LVxmcmFjeyh4LVxtdSleMn17MlxzaWdtYV4yfX0kCi0gRXZlbiBpZiBlYWNoIHNhbXBsZS1kZXJpdmVkIHJhbWRvbSB2YXJpYWJsZSBpbiBhIGxhcmdlIGNvbGxlY3Rpb24gb2YgcmFuZG9tIHZhcmlhYmxlcyAoZnJvbSB0aGUgc2FtZSBwb3B1bGF0aW9uKSBpcyBub24tR2F1c3NpYW4sIHRoZWlyIG1lYW5zIGFyZSBkaXN0cmlidXRlZCBub3JtYWxseSEKJFxyaWdodGFycm93JCAqY2VudHJhbCBsaW1pdCB0aGVvcmVtKgoKIyMgRGF0YSB0cmFuc2Zvcm1hdGlvbgoKLSAkeScgPSBteStiJAotICR5JyA9IFxzcXJ0e3l9JAotICR5JyA9IFxsb2d7eX0kCi0gKlotc2NvcmUqOiAkWiA9IFxmcmFje3hfe2l9LVxvdmVybGluZXt4fX17U197eH19JAokXHJpZ2h0YXJyb3ckIHN0YW5kYXJkaXphdGlvbiEgd2l0aG91dCB1bml0cyEKJFxyaWdodGFycm93JCBCYXNlZCBvbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgc3RhbmRhcmRpc2VzIG5vcm1hbCBkYXRhIHRvIHplcm8gbWVhbiBhbmQgdW5pdCB2YXJpYW5jZQoKIyMgVmFyaW91cyBEaXN0cmlidXRpb25zCgojIyMgVGhlIFN0dWRlbnQncyB0IGRpc3RyaWJ1dGlvbgpUaGUgcmVzdWx0IG9mIHRyeWluZyB0byBlc3RpbWF0ZSB0aGUgbWVhbiBvZiBhIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHBvcHVsYXRpb24gd2hlbiAqbiBpcyBzbWFsbCBhbmQgJFxzaWdtYSQgaXMgdW5rbm93bioKCi0gbiA9IH4gMzAKLSAkWCBcc2ltIGYocF97MX0gXGRvdHMgcF97bn0pJAotICRYIFxzaW0gVChcbnUpJAotICRcbnUgPiAwJDogdGhlIGRlZ3JlZXMgb2YgZnJlZWRvbQoKIyMjIERlZ3JlZXMgb2YgZnJlZWRvbQpUaGUgbnVtYmVyIG9mIGluZGVwZW5kZW50IHVuaXRzIG9mIGluZm9ybWF0aW9uIHVzZWQgaW4gdGhlIGVzdGltYXRpb24gb2YgYSBwYXJhbWV0ZXIgb3IgY2FsY3VsYXRpb24gb2YgYSBzdGF0aXN0aWMgfiB0aGUgbnVtZXIgb2YgdmFsdWVzIHRoYXQgYXJlICdmcmVlIHRvIHZhcnknIGluIHRoaXMgcHJvY2Vzcy4KbiB2YWx1ZXMgaGF2ZSBuIGRlZ3JlZXMgb2YgZnJlZWRvbSB1bnRpbCBzb21ldGhpbmcgKGUuZy4gYSBtZWFuKSBpcyBlc3RpbWF0ZWQgLSB0aGlzIGNvbnN1bWVzIGEgZGVncmVlIG9mIGZyZWVkb20gJFxyaWdodGFycm93JCB0aGlzIGRvZXMgbm90IGFwcGx5IHRvIG5vbi1wYXJhbWV0cmljIHRlc3RzIChlLmcuIHNwZWFybWFuIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50KSBiZWNhdXNlIHRoZSB0ZXN0cyB1c2UgcmFua3MuCgojIyMgVGhlIERpc2NyZXRlIFJhbmRvbSBWYXJpYWJsZQpBIHZhcmlhYmxlIHdob3NlIHZhbHVlLCAqd2hpY2ggaXMgYWx3YXlzIGFuIGludGVnZXIqLCB2YXJpZXMgYWNjb3JkaW5nIHRvICdjaGFuY2UnLiBFYWNoIHBvc3NpYmxlIHZhbHVlIGhhcyBhIHByb2JhYmlsaXR5IGFzc2lnbmVkIHRvIGl0LgoKLSBwcm9iYWJpbGl0eSBtYXNzIGZ1bmN0aW9uIGZvciBhIGRpc2NyZXRlIHZhcmlhYmxlCi0gYXNzaWducyBhIHByb2JhYmlsaXR5IHRvIGEgZGlzY3JldGUgb3V0Y29tZQotICRcb3ZlcmxpbmV7eH0gXHJpZ2h0YXJyb3cgXG11X3t4fSA9IFxzdW1fe2k9MX1eTiBwX3tpfSB4X3tpfSQKLSAkc14yIFxyaWdodGFycm93IFxzaWdtYV97eH1eMiA9IFxzdW1fe2k9MX1eTiBwX3tpfSh4X3tpfS1cbXVfe3h9KV4yJAoKIVtdKG1lZGlhL3JhbmRvbV92YXJpYWJsZS5qcGcpCgojIyMgVGhlIEJpbm9taWFsIERpc3RyaWJ1dGlvbgpUaGUgZGlzY3JldGUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIG9mIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2VzIGluIG4sIGluZGVwZW5kZW50IHllcy9ubyBleHBlcmltZW50cy4gRWFjaCB0cmlhbCBpcyBhc3NvY2lhdGVkIHdpdGggYSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzIHAsIGFuZCBhIHByb2JhYmlsaXR5IG9mIGZhaWx1cmUgcSAoY29tcGxlbWVudCksIHdoZXJlICRxID0gMSAtcCQgKE9uZSBvZiB0aGUgcG9wdWxhciBkaXNjcmV0ZSB2YXJpYWJsZXMpCgotICRYIFxzaW0gQihuLHApJAotICRuIFxpbiBOJDogbnVtYmVyIG9mIHRyaWFscyAkXHJpZ2h0YXJyb3ckIG5vdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZnJvbSBhIEIobixwKSBkaXN0cmlidXRpb24sIGJ1dCB0cmlhbHMgd2l0aGluIHRoZSBkaXN0cmlidXRpb24KLSAkcCBcaW4gWzAsMV0kOiBmYWlsdXJlLCBzdWNjZXNzCi0gdGhlIG51bWJlciBvZiBzdWNjZXNzZXMgaywgYWZ0ZXIgbiBpbmRlcGVuZGV0IHRyaWFscyBpcyBnaXZlbiBieTogJFAoWD1rKT1cYmlub217bn17a31wXmsoMS1wKV57bi1rfSQgJFxyaWdodGFycm93JCAKLSBCZXJub3VsbGkgZGlzdHJpYnV0aW9uOiB5ZXMgLyBubyByZXN1bHRzCgojIyMgVGhlIFBvaXNzb24gRGlzdHJpYnV0aW9uCkFzc29jaWF0ZWQgd2l0aCByYXJlIGV2ZW50cyAkXHJpZ2h0YXJyb3ckIHByb2JhYmlsaXR5IG9mIGsgZXZlbnRzIGhhcHBlbmluZyBpbiBhIGdpdmVuIHRpbWUgcGVyaW9kIG9yIGluIGEgZ2l2ZW4gc3BhdGlhbCByYW5nZSB3aGVyZSAkXGxhbWJkYSQgaXMgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBldmVudHMgKGtub3duIG9yIGVzdGltYXRlZCkKJFxyaWdodGFycm93JCAkXGFwcHJveCBCKG4scCkkIHdpdGggbGFyZ2UgbiBhbmQgc21hbGwgcAoKLSAkWCBcc2ltIFBvaXMoXGxhbWJkYSkkCi0gJFxsYW1iZGEgPiAwJDogZXF1aXZhbGVudCB0byBFKFgpIGFuZCBWYXIoWCkKLSBmb3IgJGsgXGluIFx7MSwyLFxkb3RzLG5cfSQsIHRoZSBwcm9iYWJpbGl0eSBtYXNzIGZ1bnRpb24gb2YgWCBpczogJFAoWD1rKT1cZnJhY3tcbGFtYmRhXmtlXnstXGxhbWJkYX19e2shfSQKCiRccmlnaHRhcnJvdyQgZGlzY3JldGUgcHJvYmFiaWxpdHkgbWFzcyBmdW5jdGlvbgoKIyMgQ2hhcmFjdGVyCgoqQ292YXJpYW5jZSoKJFxyaWdodGFycm93JCBob3cgZG8gdGhlIHZhcmlhbmNlcyBvZiB0d28gdmFyaWFibGVzIHJlbGF0ZT8KCipDb3JyZWxhdGlvbioKJFxyaWdodGFycm93JCBQZWFyc29uJ3MgY29lZmZpY2llbnQ6IG9ubHkgbGluZWFyIGNvcnJlbGF0aW9uCi0gQ292KFgsWSkvc3gqc3kKLSBjYXJlcyBhYm91dCB2YWx1ZXMKJFxyaWdodGFycm93JCBTcGVhcm1hbidzIHJhbmsgY29lZmZpY2llbnQ6IAotIGdpdmVzIHRoZSBkYXRhIHJhbmtzCi0gdXNlZnVsIGZvciBvcmRpbmFsIGRhdGEKCipMaW5lYXIgUmVncmVzc2lvbioKLSB5ID0gbXggKyBiCi0geCBpcyB0aGUgZXhwbGFpbmF0b3J5IGZhY3RvciAoaW5kZXBlbmRlbnQgdmFyaWFibGUpCi0geSBpcyB0aGUgcmVzcG9uc2UgKGRlcGVuZGVudCB2YXJpYWJsZSkKLSBtIGlzIHRoZSBzbG9wZQotIGIgaXMgdGhlIGludGVyY2VwdAoKLSBSMjogSG93IG11Y2ggY292YXJpYXRpb24gZG9lcyB0aGlzIG1vZGVsIGV4cGxhaW4KLSByZXNpZHVhbDogZGlmZmVyZW5jZSBiZXR3ZWVuIHByZWRpY3RlZCBhbmQgb2JzZXJ2ZWQgdmFsdWVzCgotIHRoZSBtb2RlbCB0cmFuc2Zvcm1zIHRoZSB4IHZhcmlhYmxlIHRvIGFuIGFwcHJveGltYXRpb24gb2YgeQoKIyBBbiBlY29sb2dpY2FsbHktZmxhdm91cmVkIGludHJvZHVjdGlvbiB0byBzdGF0aXN0aWNzIC0gRGF5IDMKW10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj01SWxuWHlHSUVQSSZmZWF0dXJlPXlvdXR1LmJlKQoKIyMgJEhfezB9JDogVGhlIG51bGwgaHlwb3RoZXNpcwoKLSBHb29kIGV4cGVyaW1lbnRhbGlzdHMgYXR0ZW1wdCB0byBmYWxzaWZ5IGh5cG90aGVzZXMsICpub3QqIHRvIGNvbmZpcm0gdGhlbSAoZS5nLiBjb25maXJtICRIX3swfSQsIHRoYXQgdGhlcmUgaXMgbm8gZWZmZWN0IHByZXNlbnQpCi0gW0pvdXJuYWwgb2YgQXJ0aWNsZXMgaW4gU3VwcG9ydCBvZiB0aGUgTnVsbCBIeXBvdGhlc2lzXShodHRwczovL3d3dy5qYXNuaC5jb20pCgpFeGFtcGxlIHdpdGggYmFja2dyb3VuZCBkaXN0cmlidXRpb24gKE4sICRcc2lnbWEkKQotICRIX3swfTpFKGFjdGl2aXR5KT1cbXUkIGFuZCAkSF97QX06RShhY3Rpdml0eSk8XG11JCAKLSAkSF97MH06RShhY3Rpdml0eSk9XG11JCBhbmQgJEhfe0F9OkUoYWN0aXZpdHkpPlxtdSQKLSAkSF97MH06RShhY3Rpdml0eSk9XG11JCBhbmQgJEhfe0F9OkUoYWN0aXZpdHkpXG5lcVxtdSQKCiMjIEh5cG90aGVzaXMgdGVzdGluZwoKIVtdKG1lZGlhL2h5cG90aGVzaXNfdGVzdGluZy5wbmcpCiRccmlnaHRhcnJvdyQgdGhlIGdvYWwgb2YgYSBnb29kIGV4cGVyaW1lbnQgaXMgdG8gbWluaW1pc2UgYm90aCBUeXBlIEkgYW5kIFR5cGUgSUkgZXJyb3JzCgojIyMgR2VuZXJhbCBwcm9jZWR1cmUKCi0gY2xlYXJseSBzdGF0ZSAkSF97MH0sIEhfe0F9LCBcYWxwaGEkIGFuZCBuCi0gZ2VuZXJhdGUgdGhlIG51bGwgZGlzdHJpYnV0aW9uCi0gY29sbGVjdCBkYXRhIGFuZCBjYWxjdWxhdGUgdGhlIHRlc3Qgc3RhdGlzdGljCi0gbG9jYXRlIHdoZXJlIHRoZSBzdGF0aXN0aWMgaXMgaW4gdGhlIG51bGwgZGlzdHJpYnV0aW9uCi0gZHJhdyBjb25jbHVzaW9uCgojIyMgV2hhdCBpcyBhIHN0YXRpc3RpY2FsbHkgJ3NpZ25pZmljYW50JyByZXN1bHQ/CklmIHdlIGFzc3VtZSBhIGNlcnRhaW4gc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGhvbGRzIGZvciBhIGdpdmVuIHN0YXRpc3RpYywgdGhlbiB3ZSBjYW4gcHJlZGljdCBob3cgaXQgJ3Nob3VsZCcgYmVoYXZlIGFuZCByZWFjdCB3aGVuIHRoZXJlJ3MgYSBzdHJvbmcgZGV2aWF0aW9uIGZyb20gdGhhdCBleHBlY3RhdGlvbi4KCiMjIyBUaGUgbG9naWMgb2YgdGhlIFAgdmFsdWUKQSBQIHZhbHVlIHJlZmxlY3RzIHRoZSBwcm9iYWJpbGl0eSB0aGF0ICRIX3swfSQgaXMgdHJ1ZS4gSWYgaXQgaXMgc21hbGwgKGUuZy4gPCAwLjA1KSB3ZSBjYW4gcmVqZWN0ICRIX3swfSQuCkl0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IG9uZSB3b3VsZCBvYnRhaW4gYSB0ZXN0IHN0YXRpc3RpYyBhdCBsZWFzdCBhcyBleHJ0cmVtZSBhcyB0aGUgb25lIG9ic2VydmVkIGJ5IGNoYW5jZSBhbG9uZSwgZ2l2ZW4gJEhfezB9JCBpcyB0cnVlLgoKLSBQIHZhbHVlcyBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgZWZmZWN0IHNpemUKLSBhIGxhcmdlIFAgdmFsdWUgZG9lc24ndCBtZWFuIHRoYXQgdGhlIGVmZmVjdCBzaXplIGlzIG5vdCB0aGVyZQotIG1vc3Qgb2YgdGhlIHRpbWUgaXQncyBtb3JlIGEgcXVlc3Rpb24gb2YgZXhwZXJpbWVudGFsIG9yIHNhbXBsaW5nIGRlc2lnbiAoaS5lLiBsb3cgbikKLSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgUCB2YWx1ZXMgaXMgbW9yZSBpbnZvbHZlZCB0aGFuIG5vdGVkIGhlcmUhIE1vc3QgcmVzZWFyY2hlcnMgdXNlIHRoZW0gaW5jb3JyZWN0bHksIGdpdmluZyB0aGVtIGZvciB0b28gbXVjaCB3ZWlnaHQKLSBsb3cgUCB2YWx1ZXMgZG8gbm90IG1lYW4gdGhhdCB5b3Ugd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFibGUgdG8gcmVwbGljYXRlIHlvdXIgcmVzdWx0IG9yIGdlbmVyYWxpc2UgeW91ciBpbnRlcnByZXRhdGlvbgotIGJlIGNhcmVmdWwgd2l0aCBvdmVycmVwbGljYXRpb24KLSBbUmVnaW5hIE51enpvIC0gU3RhdGlzdGljYWwgRXJyb3JzXShodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzLzUwNjE1MGEpCgojIyMgQ29uZmlkZW5jZSBpbnRlcnZhbAotIE9mdGVuIHByZWZlcmVkIGJ5IGpvdXJuYWxzIGluc3RlYWQgb2YgcCB2YWx1ZXMKLSBJIGNhbiBtYWtlIHN0YXRlbWVudHMgYmFzZWQgb24gbXkgZGF0YXMgdmFyaWF0aW9ucyBhbmQgdGhlIHN0YWJpbGl0eSBvZiB0aGUgbnVtYmVyIG9mIHJlcGxpY2F0ZXMgSSBoYXZlLCBhYm91dCBob3cgbGlrZWx5IGl0IGlzIC8gaW4gd2hpY2ggcmFuZ2UgSSB3b3VsZCBleHBlY3QgdGhlIHRydWUgcG9wdWxhdGlvbiBwYXJhbWV0ZXIgKHRoZSBtZWFuIHN0YW5kYXJkIGRldmlhdGlvbikgdG8gZmFsbCBpbnRvCi0gSXQncyBtb3JlIHRoYW4gZ2l2aW5nIGEgbG9jYXRpb24gb2YgYSBzYW1wbGUgbWVhbiBJIGFtIHByb3ZpZGluZyBhbiBpbnRlcnZhbCB3aGVyZSB0aGUgc2FtcGxlIHN0YXRpc3RpYyBjYW4gY2F0Y2gKLSBJZiB0aGUgcG9wdWxhdGlvbiBwYXJhbWV0ZXIgaXMgbm90IGluIHRoZSBjb25maWRlbmNlIGludGVydmFsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgb2JzZXJ2ZWQgZGF0YSwgdGhlbiB0aGUgZGF0YSBpcyBjb25zaWRlcmVkIGFzIG9kZAotIGNvbmZpZGVuY2UgbGV2ZWwKLSBbVW5kZXJzdGFuZGluZyBDb25maWRlbmNlIEludGVydmFsczogU3RhdGlzdGljcyBIZWxwXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXRGV3N1TzlmNzRvKQotICRcb3ZlcmxpbmV7eH0gXHBtICh6IHtcZnJhY3tcc2lnbWF9e1xzcXJ0e259fX0pJAotICRccmlnaHRhcnJvdyQgc2FtcGxlIG1lYW4gcGx1c21pbnVzIHRoZSB6IHNjb3JlIHRpbWVzIHRoZSBzdGFuZGFyZCBlcnJvciAodmFyaWFuY2UgZGl2aWRlZCBieSBzcXVhcmUgcm9vdCBvZiBudW1iZXIgb2Ygc2FtcGxlcykgCi0gc2FtcGxlIG1lYW4gZnJvbSBub3JtYWxseSBkaXN0cmlidXRlZCBkYXRhIHdpbGwgaXRzZWxmIGJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkICh3aXRoICRcbXUkIGFuZCBzdGFuZGFyZCBlcnJvciAoJFxmcmFje1xzaWdtYX17XHNxcnR7bn19KSQpCi0gWiBzY29yZXMgaGF2ZSBhIGN1bXVsYXRpdmUgbm9ybWFsIGRpc3RyaWJ1dGlvbiAoa2luZCBvZiB0aGUgZmFjdG9yIG9mIHNpZ21hIGZvciBhIGRlc2lyZWQgY29uZmlkZW5jZSkKCi0gY29uZmlkZW5jZSBpbnRlcnZhbHMgcmVmZXIgdG8gdGhlIHJlbGlhYmlsaXR5IG9mIGFuIGVzdGltYXRpb24gYmFzZWQgb24gc29tZSBkYXRhLCBub3QgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSBwYXJhbWV0ZXIgYWN0dWFsbHkgZmFsbGluZyBpbnRvIHRoZSBpbnRlcnZhbCAodGhlIHBvcHVsYXRpb24gcGFyYW1ldGVyIGRvZXNuJ3QgY2hhbmdlISkKLSBjb25maWRlbmNlIGludGVydmFscyBkbyBub3QgcHJlZGljdCB3aGVyZSBtb3N0IG9mIHlvdXIgZGF0YSBmYWxsCi0gbGlrZSBQIHZhbHVlcywgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgd2lsbCBob2xkIGluIGFuIGluZGVwZW5kZW50IGV4cGVyaW1lbnQKCiMjIHN0YXRpc3RpY2FsIHRlc3RzCgohW10obWVkaWEvdGVzdHNfb3ZlcnZpZXcucG5nKQoKLSBtb3N0IHRlc3QgcmVseSBvbiAqaW5kZXBlbmRldCogcG9wdWxhdGlvbnMgKGRpZmZlcmVuY2UgYmV0d2VlbiBzYW1wbGUgbWVhbnMpCi0gc29tZSBvdGhlciB0ZXN0IHJlbHkgb24gKnJlbGF0ZWQqIHBvcHVsYXRpb25zCgojIyMgdC10ZXN0CgotIGluZGVwZW5kZW50LCByYW5kb20gc2FtcGxlcwotIG5vcm1hbGx5IGRpc3RyaWJ1dGlvbnMKLSBwb3B1bGF0aW9ucyB2YXJpYW5jZXMgYXJlIHVua25vd24gYnV0IGFyZSBhc3N1bWVkIHRvIGJlIGVxdWFsCi0gc3R1ZGVudHMgdCBkaXN0cmlidXRpb24gKGZvciBzbWFsbCBuKQotIFotdGVzdCBmb3Igbm9ybWFsIGRpc3RyaWJ1dGlvbnMgKGZvciBsYXJnZSBuKQotIHQtdGVzdCBjYW4gYmUgdXNlZCBmb3IgbGFyZ2UgbiBidXQgYmVoYXZlcyBsaWtlIHRoZSBaIHRlc3QgJFxyaWdodGFycm93JCB0aGF0IGlzIHdoeSBwZW9wbGUgb25seSB0YWxrIGFib3V0IHRoZSB0LXRlc3QgCgojIyMgVGhlIG9uZS1zYW1wbGUgdC10ZXN0CgotIGNvbXBhcmUgc29tZSBFKFgpIHRvIHNvbWUga25vd24gdmFsdWUgd2l0aCBhIGtub3duIGRpc3RyaWJ1dGlvbgotIHVzdWFsbHkgdGhpcyB2YWx1ZSBpcyBhIG1lYW4gYmVsb25naW5nIHRvIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbgotICRIX3swfSQ6IG5vIHNpZ25pZmljYW50IGRpZmZlcmFuY2UgYmV0d2VlbiAkXG11JCBhbmQgeAotICRIX3tBfSQ6IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV3ZWVuICRcbXUkIGFuZCB4Ci0gdGVzdCBzdGF0aXN0aWMgaXMgdC1zdGF0aXN0aWMKLSAkdF97b2JzfT1cZnJhY3tcb3ZlcmxpbmV7WH0tXG11fXtcZnJhY3tzfXtcc3FydHtufX19JAotICR0X3tvYnN9PnRfe24tMSxcYWxwaGF9JCB0aGVuIHdlIHJlamVjdCAkSF97MH0kCi0gJHRfe29ic31cbGVxIHRfe24tMSxcYWxwaGF9JCB0aGVuIHdlIGFjY2VwdCAkSF97MH0kIChvciAqbm90IHJlcXVlY3QqIGl0KQotICR0X3tuLTEsXGFscGhhfSBccmlnaHRhcnJvdyQgaXMgdGhlIGNyaXRpY2FsIHZhbHVlCgojIyMgVGhlIHR3by1zYW1wbGUgdC10ZXN0CgotIGluc3RlcmVzdGVkIGluIHRoZSBsb2NhdGlvbgotIHNpbWlsYXIgdG8gb25lLXNpZGVkIHQtdGVzdAotIGNvdmFyaWFuY2UgaW5zdGVhZCBvZiB2YXJpYW5jZQotIGluc3RlYWQgb2Ygc3Vic3RyYWN0aW5nIHRoZSBtZWFuIGZyb20gYSBnaXZlbiBtZWFuIHdlIHN1YnN0cmFjdCB0aGUgbWVhbiBvZiB0aGUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIG1lYW4gb2YgYW5vdGhlciBkaXN0cmlidXRpb24gCi0gJHRfe29ic309XGZyYWN7XG92ZXJsaW5le1h9LVxvdmVybGluZXtZfX17XHNxcnR7XGZyYWN7c197eH1eezJ9fXtuX3t4fV57Mn19K1xmcmFje3Nfe3l9XnsyfX17bl97eX1eezJ9fX19JAotICR0X3tvYnN9PnRfe24tMixcYWxwaGF9JCB0aGVuIHdlIHJlamVjdCAkSF97MH0kCi0gJHRfe29ic31cbGVxIHRfe24tMixcYWxwaGF9JCB0aGVuIHdlIGFjY2VwdCAkSF97MH0kIChvciAqbm90IHJlcXVlY3QqIGl0KQotICR0X3tuLTIsXGFscGhhfSBccmlnaHRhcnJvdyQgaXMgdGhlIGNyaXRpY2FsIHZhbHVlCgojIyMgWi10ZXN0CgotIGtpbmQgb2YgdGhlIAotIHNxdWFyZXMgbWlzc2luZwotICR6PVxmcmFje1xvdmVybGluZXt4fS1cbXV9e1xmcmFje1xzaWdtYV97eH19e1xzcXJ0e259fX0kCi0gJHpfe29ic30+el97XGFscGhhfSQgdGhlbiB3ZSByZWplY3QgJEhfezB9JAotICR6X3tvYnN9XGxlcSB6X3tcYWxwaGF9JCB0aGVuIHdlIGFjY2VwdCAkSF97MH0kIChvciAqbm90IHJlcXVlY3QqIGl0KQotICR6X3tcYWxwaGF9IFxyaWdodGFycm93JCBpcyB0aGUgY3JpdGljYWwgdmFsdWUKCiMjIyBGLXRlc3QKCi0gdXN1YWxseSB1c2VkIHRvIHRlc3QgaG93IGdvb2QgYSBtb2RlbCBmaXRzIHRoZSBkYXRhCi0gZm9sbG93cyBhZnRlciByZWdyZXNzaW9uCi0gdGVzdHMgdGhlIGVxdWFsaXR5IG9mIHR3byB2YXJpYW5jZXMgKG1vZGVsZWQgZGF0YSB2cy4gcmVhbCBkYXRhKQotIGNvbnRyb2xsZWQgYnkgdGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSAoZGYpIG9mIHR3byBkaXN0cmlidXRpb25zCiFbXShtZWRpYS9mLWRpc3RyaWJ1dGlvbi5wbmcpCi0gaW4gY2FzZSBvZiAkZGZfezF9PTEkICYgJGRmX3syfT0xJCByZXBsaWNhdGlvbiBpcyBleHRyZW1lbHkgbG93ICRccmlnaHRhcnJvdyQgZXh0cmVtZSBwb2lzc29uIGRpc3RyaWJ1dGlvbiAKLSBpbiBjYXNlIG9mICRkZl97MX09MTAwJCAmICRkZl97Mn09MTAwJCByZXBsaWNhdGlvbiBpcyBoaWdoICRccmlnaHRhcnJvdyQgbm9ybWFsIGRpc3RyaWJ1dGlvbiAKLSBtb3JlIGRmcyBtZWFucyBtb3JlIGNvbmZpZGVudCBpbiB0aGUgZXN0aW1hdGlvbgotIHRoZSBtZWFuIG9mIHRoZSBkaXN0cmlidXRpb25zIGlzIGNvbm5lY3RlZCBhcyBpdCBpcyBwYXJ0IG9mIHRoZSB2YXJpYW5jZXMKCi0gRi1zdGF0aXN0aWMgY29tZXMgb3V0IG9mIHRoZSBGLXRlc3QKLS0gc3VtIG9mIHNxdWFyZXMgb2YgdGhlIGV4cGxhaW5lZCB2YXJpYXRpb24gKG1vZGVsZWQpICYgc3VtIG9mIHNxdWFyZXMgb2YgdGhlIHVuZXhwbGFpbmVkIHZhcmlhdGlvbgoKIyMjIEFOT1ZBCgotIHVzZWQgdG8gdGVzdCB3aGV0aGVyIGdyb3VwcyBhcmUgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlcgotIEFOT1ZBIGFuZCB0LXRlc3QgYXJlIGNsb3NlbHkgbGlrZWQgdG9nZXRoZXIgJFxyaWdodGFycm93JCB0d28tc2EgbXBsZSBBTk9WQSBpcyBlcXVpdmFsZW50IHRvIHQtdGVzdAotIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIGdyb3VwIDEgYW5kIGdyb3VwIDIgYXJlIG92ZXJsYXBwaW5nIHdoZW4gZ3JvdXAgMyBpcyBjb21wbGV0bHkgb2ZmICRccmlnaHRhcnJvdyQgQU5PVkEgd2lsbCBnaXZlIHlvdSBhIHNpZ25pZmljYW50IHJlc3VsdCwgdGhhdCBhdCBsZWFzdCAxIGdyb3VwIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlcnMKLSAkSF97MH06XG11X3sxfT1cbXVfezJ9PVxtdV97M309Li4uPVxtdV97bn0gXHJpZ2h0YXJyb3ckIG5vdCB0cmVhdG1lbnQgZWZmZWN0Ci0gJEhfe0F9JCBhdCBsZWFzdCBvbmUgZ3JvdXAgaGFzIGRpZmZlcmVudCBtZWFuCgotIHByb2Nlc3MKLS0gcGFydGl0aW9uICp2YXJpYXRpb24qIGludG8gKm1vZGVsbGVkIHZhcmlhdGlvbiogYW5kICplcnJvciogKHJlc2lkdWFscykKLS0gZ2VuZXJhdGVzIGFuIGYtc3RhdGlzdGljOiBtb2RlbGxlZC9lcnJvciB2YXJpYW5jZQotLSBsYXJnZSBGLXZhbHVlcyBpbmRpY2F0ZSB0aGF0IHRoZSBtb2RlbCBleHBsYWlucyBtb3N0IG9mIHRoZSB2YXJpYW5jZSAKCi0gYXNzdW1wdGlvbnMKLS0gcmVzcG9uc2UgdmFyaWFibGVzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCAoY2hlY2sgd2l0aCBCYXJsZXR0J3Mgb3IgTGV2ZW5lJ3MgdGVzdCwgYnV0IGFsc28gbG9vayBhdCBpdCEhISkKLS0gdmFyaWFuY2VzIG9mIHJlc3BvbmNlIHZhcmlhYmxlcyBhcmUgZXF1YWwgKGNoZWNrIGZvciBoZXRlcm9zY2VkYXN0aWNpdHksIGNvcnJlY3Rpb25zIGF2YWlsYWJsZSkKLS0gc2FtcGxlcyBhcmUgaW5kZXBlbmRlbnQKLS0gJCRGX3tOLEt9PVxmcmFje1xzdW1fe2l9e25fe2l9KFxvdmVybGluZXtZX3tpfX0tXG92ZXJsaW5le1xvdmVybGluZXtZfX0pXjIvSy0xfX17XHN1bV97aSxqfXsoWV97aSxqfS1cb3ZlcmxpbmV7WV97aX19KV4yL04tS319JCQKLS0gZm9jdXMgb24gJCRGPVxmcmFje1NTX3tiZXR3ZWVufX17U1Nfe3dpdGhpbn19JCQKLS0gU1NiZXR3ZWVuIC0tPiBmaXQKLS0gU1N3aXRoaW4gLS0+IGVycm9yCi0tIE4gPSBvdmVyYWxsIHNhbXBsZSBzaXplCi0tIEsgPSBudW1iZXIgb2YgZ3JvdXBzCi0tIGogPSBvYnNlcnZhdGlvbnMKLS0gaSA9IGdyb3VwcwotLSAkXG92ZXJsaW5le1l9JCA9IGdyb3VwIG1lYW4KLS0gJFxvdmVybGluZXtcb3ZlcmxpbmV7WX19JCA9IGdyYW5kIG1lYW4KCiFbXShtZWRpYS9hbm92YV9vdmVydmlldy5wbmcpCgotIGludGVyZXN0ZWQgaW4gdGhlIHNoYXBlCgojIyMgVGhlICRcY2hpXjIkCgotIHVzZWQgdG8gcmVsYXRlIHRoZSBwcm9wb3J0aW9ucyBvZiBjb3VudCBkYXRhIHRvIHRoZSBleHBlY3RlZCBwcm9wb3J0aW9uIHVuZGVyIGEgJFxjaGleezJ9JC1kaXN0cmlidXRpb24KLSBjYW1wYXJlcyBwcm9wb3J0aW9ucyBvZiBvYnNlcnZlZCBjb3VudHMgdG8gcHJvcG9ydGlvbnMgb2YgZXhwZWN0ZWQgY291bnRzCi0gaHlwb3RoZXNlczogcHJvYmFiaWxpdHkgb2YgYW55IGluZGl2aWR1YWwgY291bnQgYmVpbmcgaW4gYSBnaXZlbiBjYXRlZ29yeQotIGFyZSB0aGUgb2JzZXJ2YXRpb25zIGVxdWFsIHRvIHRoZSBleHBlY3RhdGlvbnMKLSBleHBlY3RlZCB2YWx1ZXMgYXJlIGVzdGltYXRlZCBmcm9tIHRoZSBkYXRhIGl0c2VsZgotIGNvbnRpbmdlbmN5IHRhYmxlICRccmlnaHRhcnJvdyQgbWFyZ2lucyBhcmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGV4cGVjdGF0aW9ucwoKLSBleHBlY3RhdGlvbnMgZm9yIGFueSBjZWxsOiBFID0gKHJvd1N1bSB4IGNvbFN1bXMpIC8gdGFibGVTdW0KLSBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBleHBlY3RlZCBhbmQgb2JzZXJ2ZWQgJFxyaWdodGFycm93IFxjaGkkIAotICRcY2hpXjIkLXN0YXRpc3RpYzogJCRcY2hpXnsyfT1cZnJhY3tcc3VteyhPX3tpfS1FX3tpfSleMn19e0Vfe2l9fSQkCgojIyMgRmlzaGVyJ3MgZXhhY3QgdGVzdApmb3IgY2F0ZWdvcmljYWwgZGF0YQoKLSBleGFjdCwgYmVjYXVzZSB0aGUgcC12YWx1ZSBpcyBjYWxjdWxhdGVkIGV4YWN0bHkgJFxyaWdodGFycm93JCBubyBkaXN0cmlidXRpb24gaXMgdXNlZAotIG4gaXMgdXN1YWxseSBzbWFsbCwgYnV0IGFsc28gdXNhYmxlIGZvciBsYXJnZSBuIChidXQgdGhlcmUgYXJlIG1vcmUgcG93ZXJmdWwgdGVzdHMpCi0tIHAgZG9lc24ndCBoYXZlIHRvIGJlIGVzdGltYXRlZAotIG5vbi1wYXJhbWV0cmljCgohW10obWVkaWEvZmlzaGVyLnBuZykKCiMjIE5vbi1wYXJhbWV0cmljIHRlc3RzCgotIGZvciBub24tbm9ybWFsIGRhdGEsIGFuZCB3aGVuIHRyYW5zZm9ybWF0aW9uIGRvZXNuJ3QgaGVscAotIGRvbid0IGFzc3VtZSBhIGRpc3RyaWJ1dGlvbiAKLSBtb3JlIHJvYnVzdCAKLSB5b3UgbG9vc2UgcG93ZXIsIGJlY2F1c2UgZGF0YSBhcmUgZS5nLiByYW5rZWQsIGxlc3Mgc2Vuc2l0aXZpdHkKCi0gbW9zdCBwYXJhbWV0cmljIHRlc3QgaGF2ZSBhIG5vbi1wYXJhbWV0cmljIGVxdWl2YWxlbnQKIVtdKG1lZGlhL3Bhcl9ucGFyX3Rlc3RzLnBuZykKCi0gc2lnbmlmaWNhbmNlIGlzIHRlc3QgYnkgY3JlYXRpbmcgb3VyIG93biBkaXN0cmlidXRpb24gJFxyaWdodGFycm93JCByZXNhbXBsaW5nCgojIyBSZXNhbXBsaW5nCnVzZWQgdG8gdGVzdCBzaWduaWZpY2FuY2Ugb2Ygbm9uLXBhcmFtZXRyaWMgdGVzdHMKCiMjIyBKYWNra25pZmluZwoKMSkgY2FsY3VsYXRlIHN0YXRpc3RpYyBmcm9tIG9yaWdpbmFsIGRhdGEKMikgcmVtb3ZlIHJvd3Mgb2YgdGhlIGRhdGEgcmFuZG9tbHkgKGFzIG9mdGVuIGFzIHlvdSBjYW4sIGxpbWl0ZWQgYnkgb3JpZ2luYWwgZGF0YSkKMykgcmVjYWxjdWxhdGUgdGVzdCBzdGF0aXN0aWMKNCkgdGhlIGRpc3RyaWJ1dGlvbiBvZiBzdGF0aXN0aWNzIGlzIG1lc3NlZCB1cAokXHJpZ2h0YXJyb3ckIHdoZW4gb3JpZ2luYWwgc3RhdGlzdGljIGZhbGxzIGludG8gdGhlIG5ldyBkaXN0cmlidXRpb24gdGhlcmUgYXJlIG5vIGRpZmZlcmVuY2VzCiRccmlnaHRhcnJvdyQgd2hlbiBvcmlnaW5hbCBzdGF0aXN0aWMgZmFsbHMgb3V0IG9mIHRoZSBuZXcgZGlzdHJpYnV0aW9uIHRoZXJlIGlzIGEgZGlmZmVyZW5jZQoKIyMjIEJvb3RzdHJhcHBpbmcKCjEpIGNhbGN1bGF0ZSBzdGF0aXN0aWMgZnJvbSBvcmlnaW5hbCBkYXRhCjIpIGJvb3RzdHJhcCB0aGUgcm93cy9jb2x1bW5zIChyZW1vdmUgc29tZSAvIGFkZCBzb21lIGZyb20gb3JpZ2luYWwgZGF0YSApCgojIyMgUGVybXV0YXRpb24KCi0gaXQgbWF0dGVycyBob3cgd2UgcGVybXV0ZQotLSBlLmcuIHdoZW4gd2UgcGVybXV0ZSB3aXRoaW4gYSBzcGVjaWVzIGNvbHVtbiwgdGhlIGRpc3RyaWJ1dGlvbiBvdmVyIHNpdGVzIGRvZXNuJ3QgbWF0dGVyCi0tIGUuZy4gd2hlbiBjb21wbGV0ZSBzcGVjaWVzIGNvbHVtbnMgYXJlIG1vdmVkLCB0aGUgc3BlY2llcyBkaXN0cmlidXRpb24gaXMgc3RpbGwgaW50YWN0Ci0gdmFyaW91cyBwZXJtdXRhdGlvbiBwb3NzaWJpbGl0aWVzCi0tIHdpdGhpbiByb3dzCi0tIG9mIHJvd3MKLS0gd2l0aGluIGNvbHVtbnMKLS0gb2YgY29sdW1ucwoK